!pip install opendatasets --upgrade
Requirement already satisfied: opendatasets in c:\users\naveen\appdata\local\programs\python\python39\lib\site-packages (0.1.20) Requirement already satisfied: tqdm in c:\users\naveen\appdata\local\programs\python\python39\lib\site-packages (from opendatasets) (4.62.3) Requirement already satisfied: click in c:\users\naveen\appdata\local\programs\python\python39\lib\site-packages (from opendatasets) (8.0.3) Requirement already satisfied: kaggle in c:\users\naveen\appdata\local\programs\python\python39\lib\site-packages (from opendatasets) (1.5.12) Requirement already satisfied: colorama in c:\users\naveen\appdata\local\programs\python\python39\lib\site-packages (from click->opendatasets) (0.4.4) Requirement already satisfied: six>=1.10 in c:\users\naveen\appdata\local\programs\python\python39\lib\site-packages (from kaggle->opendatasets) (1.16.0) Requirement already satisfied: certifi in c:\users\naveen\appdata\local\programs\python\python39\lib\site-packages (from kaggle->opendatasets) (2021.10.8) Requirement already satisfied: python-dateutil in c:\users\naveen\appdata\local\programs\python\python39\lib\site-packages (from kaggle->opendatasets) (2.8.2) Requirement already satisfied: requests in c:\users\naveen\appdata\local\programs\python\python39\lib\site-packages (from kaggle->opendatasets) (2.26.0) Requirement already satisfied: python-slugify in c:\users\naveen\appdata\local\programs\python\python39\lib\site-packages (from kaggle->opendatasets) (5.0.2) Requirement already satisfied: urllib3 in c:\users\naveen\appdata\local\programs\python\python39\lib\site-packages (from kaggle->opendatasets) (1.26.7) Requirement already satisfied: text-unidecode>=1.3 in c:\users\naveen\appdata\local\programs\python\python39\lib\site-packages (from python-slugify->kaggle->opendatasets) (1.3) Requirement already satisfied: idna<4,>=2.5 in c:\users\naveen\appdata\local\programs\python\python39\lib\site-packages (from requests->kaggle->opendatasets) (3.3) Requirement already satisfied: charset-normalizer~=2.0.0 in c:\users\naveen\appdata\local\programs\python\python39\lib\site-packages (from requests->kaggle->opendatasets) (2.0.9)
WARNING: You are using pip version 21.2.3; however, version 21.3.1 is available. You should consider upgrading via the 'C:\Users\Naveen\AppData\Local\Programs\Python\Python39\python.exe -m pip install --upgrade pip' command.
import opendatasets as od
%matplotlib inline
import numpy as np
import pandas as pd
import seaborn as sns
import os
import time
import random
import shutil
import math
import torch
import pandas as pd
import torchvision
from torchvision.datasets import ImageFolder
from torch.utils.data import Dataset, DataLoader
from torchvision import transforms, utils
from torchvision import datasets, transforms
import torch.nn.functional as F
from torchvision.utils import make_grid
import torch.nn as nn
from PIL import Image
import matplotlib.pyplot as plt
import cv2
import warnings
warnings.filterwarnings("ignore")
plt.ion() # interactive mode
print("using Pytorch version", torch.__version__)
using Pytorch version 1.10.1+cpu
ls
Volume in drive C is Windows
Volume Serial Number is B8C0-2582
Directory of C:\Users\Naveen\Downloads
17-01-2022 02:11 <DIR> .
11-01-2022 20:48 <DIR> ..
11-01-2022 20:26 <DIR> .ipynb_checkpoints
13-12-2021 10:30 192,467,033 09.mkv
08-12-2021 18:09 132 2021_12_08180829output.csv
08-12-2021 22:15 121 2021_12_08221525output.csv
09-12-2021 09:14 121 2021_12_09091407output.csv
10-12-2021 19:01 121 2021_12_10190101output.csv
09-01-2022 21:40 9,785 3.jpg
22-12-2021 22:30 246,592 558515211_2021_A01 (1).pdf
23-11-2021 14:34 52,776 558515211_2021_A01.csv
23-11-2021 14:33 246,592 558515211_2021_A01.pdf
23-11-2021 14:34 42,024 558515211_2021_A01.xlsx
09-01-2022 18:48 129,434 6.jpg
10-01-2022 21:59 1,533,613 7z2107-x64.exe
03-11-2021 09:40 98,189 aaa.docx
05-12-2021 16:25 4,402,890 assgn2.zip
13-10-2021 16:12 778,932 assign1.html
13-10-2021 16:13 898,791 assign2.html
16-11-2021 14:42 444,864 assign2Markdown.pdf
08-12-2021 22:50 882,382 Assign3.html
17-12-2021 16:46 2,420 Assignment 4.Rmd
06-10-2021 12:26 5,480 Assignment1.zip
17-12-2021 16:46 779,752 Assignment-4.html
03-12-2021 19:08 1,508,304 assignment4_naveen.pdf
23-12-2021 14:51 199,015,128 AtomSetup-x64.exe
23-12-2021 14:02 551,505,186 bdline_essh_gb.zip
10-01-2022 13:39 22,779,898 Can UK host FIFA World Cup.pptx
22-12-2021 22:17 138,240 CLIENT INPUT SHEET - BASIC DETAILS & INCOME SUMMARY..xls
02-01-2022 22:37 17,235 convolutional-neural-network-pet-photo-rate.ipynb
11-01-2022 21:18 5,891,191 covid-19 vs Pneumonia vs normal analysis.html
11-01-2022 21:40 1,577,622 covid19-diagnosis-using-vgg16-resnet-and-densenet.ipynb
22-12-2021 18:05 19,782 data_ireland.kml
22-12-2021 19:24 87,092,916 Database Notes (1).pdf
15-12-2021 19:49 87,092,916 Database Notes.pdf
16-12-2021 21:12 2,208,760 data-transformation.pdf
16-12-2021 21:12 504,140 data-wrangling-cheatsheet.pdf
07-12-2021 18:25 959,896,454 downloads_backup.zip
10-01-2022 16:18 32,483,565 draft_Naveen.mp4
07-12-2021 16:44 3,583 draft1.txt
17-01-2022 02:10 2,808,344 Drafted report.docx
08-01-2022 11:29 5,792 england football.jpg
23-12-2021 13:10 1,981,473,633 england-latest-free.shp.zip
23-12-2021 12:32 <DIR> EnglishFootballGrounds
23-12-2021 12:32 3,298 EnglishFootballGrounds.zip
31-08-2021 15:11 6,963 EPF.pdf
10-09-2021 20:44 <DIR> FIFA 21 Installer
10-09-2021 20:38 37,487,857,948 FIFA 21 Installer.zip
05-12-2021 13:31 19,727 Figure_1.png
16-12-2021 21:09 66,909 final_2017.pdf
17-12-2021 00:39 68,970 final_2018.pdf
05-12-2021 13:23 33,098 final_model_graph.png
17-12-2021 09:01 742,083 final21.html
17-12-2021 01:26 99,993 finalsol.pdf
22-12-2021 18:20 631,799 footbal_stadiums.csv
24-11-2021 20:21 48,092 football.csv
23-11-2021 14:50 126,509 FORM 16_signed_2021-22.pdf
08-01-2022 11:14 228,763 GettyImages-453347919.jpg
01-10-2021 09:52 104,620 Graduate Programmes.xlsx
06-10-2021 12:25 1,062,279 h1 (1).pdf
12-12-2021 20:48 1,062,279 h1 (2).pdf
12-12-2021 20:48 1,062,279 h1 (3).pdf
29-09-2021 22:05 1,062,279 h1.pdf
12-12-2021 20:48 93,533 h2 (1).pdf
10-10-2021 08:03 63,136 h2.pdf
26-11-2021 13:13 57,467 h4.pdf
13-11-2021 20:55 798,782 helpful_hints.html
01-01-2022 18:16 330,400 hospital.geojson
11-01-2022 20:21 <DIR> image dataset
11-01-2022 20:21 165,557,612 image dataset.zip
22-12-2021 13:37 514,952,619 ireland-and-northern-ireland-latest-free.shp.zip
01-11-2021 11:13 33,908,132 JAGS-4.3.0 (1).exe
16-01-2022 21:56 143,284 lecture-03-scan.pdf
16-01-2022 21:57 101,617 lecture-04-scan.pdf
16-01-2022 22:06 977,418 lecture-05-scan.pdf
16-01-2022 22:08 974,902 lecture-06-scan.pdf
16-01-2022 22:08 109,578 lecture-07-scan.pdf
16-01-2022 22:09 101,489 lecture-08-scan.pdf
16-01-2022 22:09 64,235 lecture-09-scan.pdf
16-01-2022 22:09 48,299 lecture-10-scan.pdf
16-01-2022 22:52 67,394 lecture-11-scan.pdf
16-01-2022 22:53 77,403 lecture-12-scan.pdf
16-01-2022 22:53 50,777 lecture-13-scan.pdf
16-01-2022 22:53 72,096 lecture-14-scan.pdf
16-01-2022 22:54 498,585 lecture-15-16-slides-ica.pdf
16-01-2022 22:54 35,761 lecture-15-scan.pdf
16-01-2022 22:54 20,884 lecture-16-scan-gaussian.pdf
16-01-2022 22:54 98,674 lecture-17-scan.pdf
16-01-2022 22:54 75,659 lecture-18-scan.pdf
16-01-2022 22:54 148,907 lecture-20-scan.pdf
16-01-2022 22:54 71,701 lecture-22-scan.pdf
02-12-2021 17:26 2,579,570 LinearModelAssign-4 (2).pdf
08-10-2021 22:07 1,384,687 lm.pdf
11-10-2021 15:59 1,289,615 lm_assignment1 (1).pdf
08-10-2021 22:15 1,289,615 lm_assignment1.pdf
08-10-2021 22:13 1,289,792 lm_organized.pdf
31-12-2021 22:57 2,429,480 london restaurants.geojson
31-12-2021 20:07 85,724 london_airports.geojson
01-01-2022 00:42 3,473,221 london_hotels.geojson
01-01-2022 13:26 160,858 london_hotels1.geojson
01-01-2022 14:31 1,808,213 london_hotels2.geojson
29-12-2021 11:56 1,354,754 london_stadiums.geojson
13-01-2022 00:29 590,641 main (1).html
13-01-2022 09:36 4,060 main (1).py
02-12-2021 20:02 3,070 main (1).R
13-01-2022 00:30 590,641 main (2).html
13-01-2022 00:38 590,590 main (3).html
13-01-2022 09:36 594,409 main (4).html
12-01-2022 15:16 584,512 main.html
13-01-2022 00:30 11,516 main.md
13-01-2022 09:34 4,141 main.py
19-08-2021 10:08 75,887,576 McAfee_Installer_serial_zrCtx56YdBTifr4vyYT3GQ2_key_affid_1289_akey.exe
09-01-2022 21:55 14,068 MicrosoftTeams-image.png
13-01-2022 09:36 <DIR> ML Assignment
16-01-2022 22:58 3,762,577 ML class notes.pdf
11-01-2022 21:03 28,457,133 model_1_densenet.pt
11-01-2022 20:58 44,833,687 model_1_resnet.pt
11-01-2022 20:57 37,682,671 model_2.pt
12-09-2021 21:13 5,690 mow.png
03-01-2022 19:25 258,811 Mr. Naveen Ramprasad Tenancy Agreement signed (1).pdf
03-01-2022 19:23 258,811 Mr. Naveen Ramprasad Tenancy Agreement signed.pdf
03-01-2022 15:35 162,959 Mr. Naveen Ramprasad Tenancy Agreement.pdf
25-11-2021 08:18 151,587 Naveen CV.pdf
03-01-2022 19:18 118,318 Naveen ID.jpeg
03-01-2022 19:20 231,494 Naveen ID-converted.pdf
07-10-2021 18:55 1,186,394 NAVEEN RAMPRASAD_401668_0 (1).pdf
07-10-2021 18:43 1,186,394 NAVEEN RAMPRASAD_401668_0.pdf
27-10-2021 19:09 835,388 NAVEEN RAMPRASAD_438426_0.pdf
12-11-2021 13:21 321,792 NAVEEN RAMPRASAD_453069_0.pdf
23-11-2021 23:54 3,563,879 NAVEEN RAMPRASAD_469677_0.pdf
22-12-2021 13:07 306,689 NAVEEN RAMPRASAD_536919_0.pdf
03-01-2022 19:20 90,189 Naveen rev ID.jpeg
03-11-2021 17:14 788,128 naveen_assign4.html
19-11-2021 20:10 2,498,274 naveen_assignment3.pdf
06-12-2021 11:25 2,468,472 naveen_bayesian_assign3 (1).pdf
30-11-2021 16:33 2,468,472 naveen_bayesian_assign3.pdf
25-10-2021 15:29 608,861 naveen_bayesian_assignment1_answers (1).pdf
27-10-2021 12:06 608,861 naveen_bayesian_assignment1_answers.pdf
23-11-2021 14:35 42,042 naveen_fy2020.xlsx
10-01-2022 13:59 90,640,720 OBS-Studio-27.1.3-Full-Installer-x64.exe
11-09-2021 19:02 741,546 only passport front page.pdf
09-09-2021 12:07 1,706,577,306 optiver-realized-volatility-prediction.zip
22-12-2021 22:29 224,441 OpTransactionHistoryTpr23-12-2021.pdf
10-09-2021 20:54 63,656,424 OriginThinSetup.exe
03-01-2022 11:58 989,776 osgeo4w-setup.exe
11-01-2022 21:16 23,928,832 pandoc-2.16.2-windows-x86_64.msi
11-10-2021 07:30 114,169 passport address page.pdf
11-10-2021 07:30 140,510 passport front page (1).pdf
11-09-2021 19:04 383,931 passport front page.pdf
02-01-2022 22:43 1,030,728,211 petfinder-pawpularity-score.zip
27-09-2021 20:02 147,935,384 pgadmin4-5.7-x64.exe
24-12-2021 16:17 157,942,904 pgadmin4-6.3-x64.exe
30-09-2021 06:31 128,236,408 Postman-win64-8.11.1-Setup.exe
17-10-2021 16:52 134,647 PPSN (1).PNG
09-12-2021 00:15 7,105,260 ppts.pptx
02-01-2022 22:05 <DIR> preprocessed_data.csv
02-01-2022 22:05 495,182 preprocessed_data.csv.zip
09-09-2021 12:16 390,035,696 pycharm-community-2021.2.1.exe
09-09-2021 12:22 28,895,456 python-3.9.7-amd64.exe
04-11-2021 08:23 409,500,392 QGIS-OSGeo4W-3.16.12-1-Setup-x86_64.exe
03-01-2022 12:34 1,062,685,696 QGIS-OSGeo4W-3.16.15-1.msi
08-12-2021 22:50 2,344 ques3.txt
10-12-2021 16:06 4,098 r.R
17-12-2021 02:31 14,138,526 R_All_slides.pdf
17-12-2021 02:31 30,154 r_exam_doc.xlsx
09-09-2021 21:14 89,550,304 R-4.1.1-win.exe
23-12-2021 12:49 104,288 RAMPRASAD NAVEEN_BGNPN4873J_FY201920_16_SIGNED.pdf
16-01-2022 19:29 2,597,100 Report (1).docx
03-01-2022 08:32 5,746,082 restaurants.geojson
13-09-2021 21:40 48,068 Resume-2018.docx
09-09-2021 21:18 156,183,344 RStudio-1.4.1717.exe
23-12-2021 13:02 377,245,127 scotland-latest-free.shp.zip
10-01-2022 14:43 21,431 script.docx
05-12-2021 10:04 87,776 sonar.all-data
07-12-2021 18:25 <DIR> srikanthan_tirumala-hooper-s3-proxy-9de6a38098ef
07-12-2021 18:23 148,049 srikanthan_tirumala-hooper-s3-proxy-9de6a38098ef.zip
30-11-2021 16:48 1,134,357 ST405_Assignment3.html
30-11-2021 16:44 7,457 ST405_Assignment3.Rmd
09-12-2021 13:50 <DIR> ST661 exam 2020, with solution-20211209
09-12-2021 13:49 252,532 ST661 exam 2020, with solution-20211209.zip
15-12-2021 09:55 1,173,121 St661 Group Project Presentation.pptx
10-12-2021 16:28 1,540,224 ST661_group7_report.html
10-12-2021 16:27 29,980 ST661_group7_report.Rmd
24-12-2021 21:26 9,931 statistic_id865968_population-of-scotland-2020-by-council-area.xlsx
24-12-2021 20:04 10,857 statistic_id971694_population-of-england-in-2020-by-county.xlsx
05-10-2021 21:50 964,624 stats_assignment1_answers (1).pdf
07-10-2021 18:43 964,624 stats_assignment1_answers (2).pdf
10-10-2021 11:00 964,624 stats_assignment1_answers (3).pdf
05-10-2021 15:48 904,168 stats_assignment1_answers.pdf
12-09-2021 21:49 17,314 Student-CV-Template.docx
03-12-2021 18:56 731,543 test.html
10-12-2021 01:36 3,422 test.Rmd
07-12-2021 18:27 12 test_output.csv.csv
07-01-2022 20:38 46,278 test1.sql
10-12-2021 10:36 21,759 tf_draft (2).Rmd
10-12-2021 11:42 21,773 tf_draft (3).rmd
10-12-2021 10:55 23,481 tf_draft _js1
10-12-2021 10:33 1,068,795 tf_draft.html
10-12-2021 10:36 18,891 tf_draft.Rmd
10-12-2021 10:33 <DIR> tf_draft_files
10-12-2021 10:38 23,481 tf_draft_js
09-12-2021 16:20 5,302 tf_draft_mg
10-12-2021 11:48 28,748 tf_draft_mg1
10-12-2021 13:13 31,219 tf_draft_mg2
10-12-2021 11:47 28,748 tf_draft_naveens_version (1).Rmd
10-12-2021 16:03 29,979 tf_draft_naveens_version.Rmd
08-01-2022 14:13 114,088 the-four-countries-of-the-united-kingdom.jpg
24-11-2021 16:13 21,387 tut.php
24-12-2021 20:01 2,576,896 ukpopestimatesmid2020on2021geography.xls
04-11-2021 08:21 5,095,424 Unconfirmed 707591.crdownload
11-10-2021 07:30 186,996 visa.jpeg
16-01-2022 23:12 42,762,464 vlc-3.0.16-win64.exe
03-01-2022 18:37 348,992 WebLaunchRecorder.exe
27-09-2021 17:31 44,721 WhatsApp Image 2021-09-27 at 6.31.02 PM.jpeg
05-10-2021 20:23 153,214 WhatsApp Image 2021-10-05 at 9.22.39 PM.jpeg
05-10-2021 20:24 177,217 WhatsApp Image 2021-10-05 at 9.22.39 PM-converted.pdf
05-10-2021 20:24 1,081,170 WhatsApp Image 2021-10-05 at 9.22.39 PM-converted-merged.pdf
25-10-2021 15:25 111,072 WhatsApp Image 2021-10-25 at 4.25.32 PM.jpeg
25-10-2021 15:27 111,931 WhatsApp Image 2021-10-25 at 4.25.32 PM-converted.pdf
25-10-2021 15:27 678,118 WhatsApp Image 2021-10-25 at 4.25.32 PM-converted-merged.pdf
19-11-2021 19:57 61,259 WhatsApp Image 2021-11-19 at 7.56.22 PM (1).jpeg
19-11-2021 19:57 71,832 WhatsApp Image 2021-11-19 at 7.56.22 PM (2).jpeg
19-11-2021 19:57 78,075 WhatsApp Image 2021-11-19 at 7.56.22 PM (3).jpeg
19-11-2021 19:57 67,249 WhatsApp Image 2021-11-19 at 7.56.22 PM (4).jpeg
19-11-2021 19:57 77,123 WhatsApp Image 2021-11-19 at 7.56.22 PM (5).jpeg
19-11-2021 19:58 73,890 WhatsApp Image 2021-11-19 at 7.56.22 PM (6).jpeg
19-11-2021 19:58 57,255 WhatsApp Image 2021-11-19 at 7.56.22 PM (7).jpeg
19-11-2021 19:58 68,234 WhatsApp Image 2021-11-19 at 7.56.22 PM (8).jpeg
19-11-2021 19:57 69,064 WhatsApp Image 2021-11-19 at 7.56.22 PM.jpeg
10-01-2022 21:57 1,016,632 winzip26-downwz.exe
29-11-2021 00:38 1,016,632 winzip26-home.exe
220 File(s) 48,544,929,052 bytes
11 Dir(s) 106,506,862,592 bytes free
class_names = ['Normal', 'Viral Pneumonia', 'Covid']
data_dir = 'image dataset/Covid19-dataset'
The dataset is a set of x-RAY images of normal patients,patients having covid and patients having pneumonia.Hence this is a 3 class classification problem
train_transform = transforms.Compose([
transforms.Resize(size=(224, 224)),
transforms.RandomHorizontalFlip(),
transforms.ToTensor(),
transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])
test_transform = transforms.Compose([
transforms.Resize(size=(224, 224)),
transforms.ToTensor(),
transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
])
train_ds = ImageFolder(data_dir+'/train', train_transform)
test_ds = ImageFolder(data_dir+'/test', test_transform)
classes = train_ds.classes
classes
['Covid', 'Normal', 'Viral Pneumonia']
def describe_dataset(data):
classes_count = { c:0 for c in classes}
for _,label in data:
classes_count[classes[label]]+=1
print(f'Classes: {len(classes)} - {classes} ')
print(f'Examples: {len(data)}')
print(f'Counts: {classes_count}')
plt.bar(classes_count.keys(),classes_count.values(), alpha=0.3 )
return classes_count
_ = describe_dataset(train_ds)
Classes: 3 - ['Covid', 'Normal', 'Viral Pneumonia']
Examples: 251
Counts: {'Covid': 111, 'Normal': 70, 'Viral Pneumonia': 70}
from torch.utils.data import random_split
random_seed = 42
torch.manual_seed(random_seed);
val_size = 30
train_size = len(train_ds) - val_size
train_ds, val_ds = random_split(train_ds, [train_size, val_size])
print("\nTRAIN DATASET")
_=describe_dataset(train_ds)
print("\nVALIDATION DATASET")
_=describe_dataset(val_ds)
print("\nTEST DATASET")
_=describe_dataset(test_ds)
dataset = None
new_dataset = None
TRAIN DATASET
Classes: 3 - ['Covid', 'Normal', 'Viral Pneumonia']
Examples: 221
Counts: {'Covid': 97, 'Normal': 65, 'Viral Pneumonia': 59}
VALIDATION DATASET
Classes: 3 - ['Covid', 'Normal', 'Viral Pneumonia']
Examples: 30
Counts: {'Covid': 14, 'Normal': 5, 'Viral Pneumonia': 11}
TEST DATASET
Classes: 3 - ['Covid', 'Normal', 'Viral Pneumonia']
Examples: 66
Counts: {'Covid': 26, 'Normal': 20, 'Viral Pneumonia': 20}
batch_size = 5
train_loader = torch.utils.data.DataLoader(train_ds, batch_size=batch_size, shuffle=True, num_workers=3, pin_memory=True)
test_loader = torch.utils.data.DataLoader(test_ds, batch_size=batch_size, shuffle=True)
valid_loader = torch.utils.data.DataLoader(val_ds, batch_size=batch_size, shuffle=True)
print('Number of training batches', len(train_loader))
print('Number of validation batches', len(valid_loader))
print('Number of test batches', len(test_loader))
Number of training batches 45 Number of validation batches 6 Number of test batches 14
def show_images(images, labels, preds):
plt.figure(figsize=(8, 4))
for i, image in enumerate(images):
plt.subplot(1, 6, i + 1, xticks=[], yticks=[])
image = image.numpy().transpose((1, 2, 0))
mean = np.array([0.485, 0.456, 0.406])
std = np.array([0.229, 0.224, 0.225])
image = image * std + mean
image = np.clip(image, 0., 1.)
plt.imshow(image)
col = 'green'
if preds[i] != labels[i]:
col = 'red'
plt.xlabel(f'{classes[int(labels[i].numpy())]}')
plt.ylabel(f'{classes[int(preds[i].numpy())]}', color=col)
if(i==5):
break
plt.tight_layout()
plt.show()
images, labels = next(iter(train_loader))
images.shape
torch.Size([5, 3, 224, 224])
show_images(images, labels, labels) #passing the predicitons as the labels
print(train_ds[0][0].shape)
train_ds[0]
torch.Size([3, 224, 224])
(tensor([[[-1.8268, -1.8097, -1.8097, ..., -1.7069, -1.6898, -1.7069],
[-1.8439, -1.8268, -1.8268, ..., -1.6898, -1.6898, -1.7240],
[-1.8439, -1.8439, -1.8268, ..., -1.6898, -1.6898, -1.7069],
...,
[-1.7583, -1.7240, -1.7240, ..., -1.8782, -1.8610, -1.8610],
[-1.7754, -1.7240, -1.7240, ..., -1.8610, -1.8782, -1.8782],
[-1.7412, -1.7240, -1.7240, ..., -1.8610, -1.8782, -1.8782]],
[[-1.7381, -1.7206, -1.7206, ..., -1.6155, -1.5980, -1.6155],
[-1.7556, -1.7381, -1.7381, ..., -1.5980, -1.5980, -1.6331],
[-1.7556, -1.7556, -1.7381, ..., -1.5980, -1.5980, -1.6155],
...,
[-1.6681, -1.6331, -1.6331, ..., -1.7906, -1.7731, -1.7731],
[-1.6856, -1.6331, -1.6331, ..., -1.7731, -1.7906, -1.7906],
[-1.6506, -1.6331, -1.6331, ..., -1.7731, -1.7906, -1.7906]],
[[-1.5081, -1.4907, -1.4907, ..., -1.3861, -1.3687, -1.3861],
[-1.5256, -1.5081, -1.5081, ..., -1.3687, -1.3687, -1.4036],
[-1.5256, -1.5256, -1.5081, ..., -1.3687, -1.3687, -1.3861],
...,
[-1.4384, -1.4036, -1.4036, ..., -1.5604, -1.5430, -1.5430],
[-1.4559, -1.4036, -1.4036, ..., -1.5430, -1.5604, -1.5604],
[-1.4210, -1.4036, -1.4036, ..., -1.5430, -1.5604, -1.5604]]]),
1)
def show_example(img, label):
print('Label: ', classes[label], "("+str(label)+")")
plt.imshow(img.permute(1, 2, 0))
show_example(*train_ds[0])
Label: Normal (1)
Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).
show_example(*train_ds[90])
Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).
Label: Viral Pneumonia (2)
def show_batch(dl):
for images, labels in dl:
fig, ax = plt.subplots(figsize=(24, 12))
ax.set_xticks([]); ax.set_yticks([])
ax.imshow(make_grid(images, nrow=16).permute(1, 2, 0))
break
show_batch(train_loader)
Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).
show_batch(test_loader)
Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).
show_batch(valid_loader)
Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).
def change_device(input):
if torch.cuda.is_available():
return input.cuda()
else:
return input
def train(model, train_loader):
model.train()
epoch_loss = 0
for train_step, (images, labels) in enumerate(train_loader):
x_train = change_device(images)
y_train = change_device(labels)
optimizer.zero_grad()
y_pred = model(x_train)
loss = loss_fn(y_pred,y_train)
loss.backward()
optimizer.step()
if(train_step%20==0):
print(f"batch: {train_step} train_loss {loss.item()} perplexity = {torch.exp(loss)}")
epoch_loss += loss.item()
return epoch_loss / (train_step +1 )
def evaluate(model, loader):
model.eval()
print("validation/test set evaluation")
epoch_loss = 0
with torch.no_grad():
accuracy = 0
for val_step, (images, labels) in enumerate(loader):
x_train = change_device(images)
y_train = change_device(labels)
y_pred = model(x_train)
loss = loss_fn(y_pred,y_train)
_, preds = torch.max(y_pred, 1)
accuracy += sum(( preds.cpu() == labels).numpy())
if(val_step%3==0):
print(f"batch: {val_step} validation_loss {loss.item()} perplexity = {torch.exp(loss)}")
epoch_loss += loss.item()
accuracy = accuracy/len(val_ds)
print(f' Accuracy: {accuracy:.4f}')
return epoch_loss / (val_step + 1)
def epoch_time(start_time, end_time):
elapsed_time = end_time - start_time
elapsed_mins = int(elapsed_time / 60)
elapsed_secs = int(elapsed_time - (elapsed_mins * 60))
return elapsed_mins, elapsed_secs
def show_preds(model,loader):
model.eval()
print("test set evaluation")
with torch.no_grad():
accuracy = 0
for test_step, (images, labels) in enumerate(loader):
x_train = change_device(images)
y_train = change_device(labels)
y_pred = model(x_train)
loss = loss_fn(y_pred,y_train)
_, preds = torch.max(y_pred, 1)
accuracy += sum(( preds.cpu() == labels).numpy())
accuracy = accuracy/len(test_ds)
print(f' Accuracy: {accuracy:.4f}')
show_images(images, labels, preds.cpu())
class VGGNet(nn.Module):
def __init__ (self):
super(VGGNet,self).__init__()
self.conv1 = nn.Conv2d(in_channels=3,out_channels=64,kernel_size=3,padding=1,stride=1) #224
self.maxPool1 = nn.MaxPool2d(2,2)
self.conv2 = nn.Conv2d(in_channels=64,out_channels=128,kernel_size=3,padding=1,stride=1) #112
self.maxPool2 = nn.MaxPool2d(2,2)
self.conv3 = nn.Conv2d(in_channels=128,out_channels=256,kernel_size=3,padding=1,stride=1) #56
self.maxPool3 = nn.MaxPool2d(2,2)
self.conv4 = nn.Conv2d(in_channels=256,out_channels=512,kernel_size=3,padding=1,stride=1) #28
self.maxPool4 = nn.MaxPool2d(2,2)
self.conv5 = nn.Conv2d(in_channels=512,out_channels=512,kernel_size=1,padding=0,stride=1)
self.maxPool5 = nn.MaxPool2d(2,2)
self.conv6 = nn.Conv2d(in_channels=512,out_channels=512,kernel_size=3,padding=1,stride=1) #14
self.maxPool6 = nn.MaxPool2d(2,2)
self.fc1 = nn.Linear(4608,1024) #7
self.fc2 = nn.Linear(1024,512)
self.fc3 = nn.Linear(512,3)
def forward(self , x):
x = self.maxPool1(F.relu(self.conv1(x)))
x = self.maxPool2(F.relu(self.conv2(x)))
x = self.maxPool3(F.relu(self.conv3(x)))
x = self.maxPool4(F.relu(self.conv4(x)))
x = self.maxPool5(F.relu(self.conv5(x)))
x = self.maxPool6(F.relu(self.conv6(x)))
x = x.reshape(x.shape[0], -1)
x = F.relu(self.fc1(x))
x = F.relu(self.fc2(x))
x = F.relu(self.fc3(x))
return x
model = change_device(VGGNet())
model
VGGNet( (conv1): Conv2d(3, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) (maxPool1): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False) (conv2): Conv2d(64, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) (maxPool2): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False) (conv3): Conv2d(128, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) (maxPool3): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False) (conv4): Conv2d(256, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) (maxPool4): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False) (conv5): Conv2d(512, 512, kernel_size=(1, 1), stride=(1, 1)) (maxPool5): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False) (conv6): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) (maxPool6): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False) (fc1): Linear(in_features=4608, out_features=1024, bias=True) (fc2): Linear(in_features=1024, out_features=512, bias=True) (fc3): Linear(in_features=512, out_features=3, bias=True) )
for param in model.parameters():
print(f' {param.size()} parameters are {param.numel()}')
torch.Size([64, 3, 3, 3]) parameters are 1728 torch.Size([64]) parameters are 64 torch.Size([128, 64, 3, 3]) parameters are 73728 torch.Size([128]) parameters are 128 torch.Size([256, 128, 3, 3]) parameters are 294912 torch.Size([256]) parameters are 256 torch.Size([512, 256, 3, 3]) parameters are 1179648 torch.Size([512]) parameters are 512 torch.Size([512, 512, 1, 1]) parameters are 262144 torch.Size([512]) parameters are 512 torch.Size([512, 512, 3, 3]) parameters are 2359296 torch.Size([512]) parameters are 512 torch.Size([1024, 4608]) parameters are 4718592 torch.Size([1024]) parameters are 1024 torch.Size([512, 1024]) parameters are 524288 torch.Size([512]) parameters are 512 torch.Size([3, 512]) parameters are 1536 torch.Size([3]) parameters are 3
def count_parameters(model):
return sum(p.numel() for p in model.parameters() if p.requires_grad)
print(f'The model has {count_parameters(model):,} trainable parameters and total memory usage is {count_parameters(model)*(4/(2**20)*3)} mb')
The model has 9,419,395 trainable parameters and total memory usage is 107.79642105102539 mb
Training and testing
Learning Rate = 3e-5; Epoch = 1
loss_fn = torch.nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(), lr=3e-5)
N_EPOCHS = 1
best_valid_loss = float('inf')
for epoch in range(N_EPOCHS):
start_time = time.time()
train_loss = train(model, train_loader)
valid_loss = evaluate(model, valid_loader)
end_time = time.time()
epoch_mins, epoch_secs = epoch_time(start_time, end_time)
if valid_loss < best_valid_loss:
print("saving the model")
best_valid_loss = valid_loss
torch.save(model.state_dict(), 'model_2.pt')
print(f'Epoch: {epoch+1:02} | Time: {epoch_mins}m {epoch_secs}s')
print(f'\tTrain Loss: {train_loss:.3f} | Train PPL: {math.exp(train_loss):7.3f}')
print(f'\t Val. Loss: {valid_loss:.3f} | Val. PPL: {math.exp(valid_loss):7.3f}')
batch: 0 train_loss 1.0941715240478516 perplexity = 2.9867072105407715 batch: 20 train_loss 1.0990883111953735 perplexity = 3.0014283657073975 batch: 40 train_loss 1.1033796072006226 perplexity = 3.014336109161377 validation/test set evaluation batch: 0 validation_loss 1.0952149629592896 perplexity = 2.9898252487182617 batch: 3 validation_loss 1.0792638063430786 perplexity = 2.9425125122070312 Accuracy: 0.7333 saving the model Epoch: 01 | Time: 1m 39s Train Loss: 1.098 | Train PPL: 2.997 Val. Loss: 1.088 | Val. PPL: 2.968
model.load_state_dict(torch.load('model_2.pt'))
<All keys matched successfully>
show_preds(model, test_loader) #learning rate 3e-5
test set evaluation Accuracy: 0.5152
Hence testing out the various learning rates I felt that a learning rate of 3e-5 showed significant improvement hence decided to use that for the rest of the models
class two_layer_Block(nn.Module):
def __init__(self, num_layers, in_channels,intermediate_channels, identity_downsample=None, stride=1):
super(two_layer_Block, self).__init__()
self.num_layers = num_layers
self.expansion = 1
self.conv1 = nn.Conv2d(in_channels,intermediate_channels,kernel_size=3, padding = 1, stride=1)
self.bn1 = nn.BatchNorm2d(intermediate_channels)
self.conv2 = nn.Conv2d(intermediate_channels,intermediate_channels,kernel_size=3, padding=1, stride= stride)
self.bn2 = nn.BatchNorm2d(intermediate_channels)
self.relu = nn.ReLU()
self.identity_downsample = identity_downsample
def forward(self, x):
identity = x.clone()
x = self.relu(self.bn1(self.conv1(x)))
x = self.bn2(self.conv2(x))
if self.identity_downsample is not None:
identity = self.identity_downsample(identity)
x += identity
x = self.relu(x)
return x
class three_layer_Block(nn.Module):
def __init__(self, num_layers, in_channels,intermediate_channels, identity_downsample=None, stride=1):
super(three_layer_Block, self).__init__()
self.num_layers = num_layers
self.expansion = 4
self.conv1 = nn.Conv2d(in_channels, intermediate_channels, kernel_size=1, stride=1, padding=0)
self.bn1 = nn.BatchNorm2d(intermediate_channels)
self.conv2 = nn.Conv2d(intermediate_channels,intermediate_channels,kernel_size=3,stride=stride,padding=1)
self.bn2 = nn.BatchNorm2d(intermediate_channels)
self.conv3 = nn.Conv2d(intermediate_channels,intermediate_channels * self.expansion,kernel_size=1,stride=1,padding=0)
self.bn3 = nn.BatchNorm2d(intermediate_channels * self.expansion)
self.relu = nn.ReLU()
self.identity_downsample = identity_downsample
self.stride = stride
def forward(self, x):
identity = x.clone()
x = self.relu(self.bn1(self.conv1(x)))
x = self.relu(self.bn2(self.conv2(x)))
x = self.bn3(self.conv3(x))
if self.identity_downsample is not None:
identity = self.identity_downsample(identity)
x += identity
x = self.relu(x)
return x
class ResNet(nn.Module):
def __init__(self, num_layers, Block, img_channels, num_classes):
super(ResNet, self).__init__()
self.expansion = 4
if ( num_layers< 50):
self.expansion = 1
if (num_layers==18):
layers = [2,2,2,2]
elif (num_layers==34):
layers = [3,4,6,3]
elif (num_layers == 50):
layers = [3,4,6,3]
elif (num_layers==101):
layers = [3,4,23,3]
elif (num_layers==152):
layers = [3,8,36,3]
print(layers)
self.in_channels = 64
self.conv1 = nn.Conv2d(in_channels=img_channels, out_channels=64, kernel_size=7, padding=3, stride=2)
self.bn = nn.BatchNorm2d(64)
self.relu = nn.ReLU()
self.maxpool = nn.MaxPool2d(kernel_size=3,stride=2,padding=1)
self.layer1 = self.make_layer(num_layers, Block, layers[0],intermediate_channels = 64,stride=1)
self.layer2 = self.make_layer(num_layers, Block, layers[1],intermediate_channels = 128,stride=2)
self.layer3 = self.make_layer(num_layers, Block, layers[2],intermediate_channels = 256,stride=2)
self.layer4 = self.make_layer(num_layers, Block, layers[3],intermediate_channels = 512,stride=2)
self.avgpool = nn.AdaptiveAvgPool2d(1)
self.fc = nn.Linear(512*self.expansion, num_classes)
def forward(self, x):
x = self.relu(self.bn(self.conv1(x)))
x = self.maxpool(x)
x = self.layer1(x)
x = self.layer2(x)
x = self.layer3(x)
x = self.layer4(x)
x = self.avgpool(x)
x = x.reshape(x.shape[0], -1)
x = self.fc(x)
return x
def make_layer(self, num_layers, block, num_residual_blocks, intermediate_channels, stride):
layers = []
identity_downsample = None
identity_downsample = nn.Sequential(nn.Conv2d(self.in_channels, intermediate_channels*self.expansion, kernel_size=1, stride=stride),
nn.BatchNorm2d(intermediate_channels*self.expansion))
layers.append(block(num_layers, self.in_channels, intermediate_channels, identity_downsample, stride))
self.in_channels = intermediate_channels * self.expansion
for i in range(num_residual_blocks - 1):
layers.append(block(num_layers, self.in_channels, intermediate_channels))
return nn.Sequential(*layers)
def ResNet18(img_channels=3, num_classes=1000):
return ResNet(18,two_layer_Block, img_channels, num_classes)
def ResNet34(img_channels=3, num_classes=1000):
return ResNet(34, two_layer_Block, img_channels, num_classes)
def ResNet50(img_channels=3, num_classes=1000):
return ResNet(50, three_layer_Block, img_channels, num_classes)
def ResNet101(img_channels=3, num_classes=1000):
return ResNet(101, three_layer_Block, img_channels, num_classes)
def ResNet152(img_channels=3, num_classes=1000):
return ResNet(152, three_layer_Block, img_channels, num_classes)
model = change_device(ResNet18(3,3))
[2, 2, 2, 2]
print(model)
ResNet(
(conv1): Conv2d(3, 64, kernel_size=(7, 7), stride=(2, 2), padding=(3, 3))
(bn): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu): ReLU()
(maxpool): MaxPool2d(kernel_size=3, stride=2, padding=1, dilation=1, ceil_mode=False)
(layer1): Sequential(
(0): two_layer_Block(
(conv1): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(bn2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu): ReLU()
(identity_downsample): Sequential(
(0): Conv2d(64, 64, kernel_size=(1, 1), stride=(1, 1))
(1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
)
)
(1): two_layer_Block(
(conv1): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(bn2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu): ReLU()
)
)
(layer2): Sequential(
(0): two_layer_Block(
(conv1): Conv2d(64, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1))
(bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu): ReLU()
(identity_downsample): Sequential(
(0): Conv2d(64, 128, kernel_size=(1, 1), stride=(2, 2))
(1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
)
)
(1): two_layer_Block(
(conv1): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu): ReLU()
)
)
(layer3): Sequential(
(0): two_layer_Block(
(conv1): Conv2d(128, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1))
(bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu): ReLU()
(identity_downsample): Sequential(
(0): Conv2d(128, 256, kernel_size=(1, 1), stride=(2, 2))
(1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
)
)
(1): two_layer_Block(
(conv1): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu): ReLU()
)
)
(layer4): Sequential(
(0): two_layer_Block(
(conv1): Conv2d(256, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(bn1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(conv2): Conv2d(512, 512, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1))
(bn2): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu): ReLU()
(identity_downsample): Sequential(
(0): Conv2d(256, 512, kernel_size=(1, 1), stride=(2, 2))
(1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
)
)
(1): two_layer_Block(
(conv1): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(bn1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(conv2): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(bn2): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu): ReLU()
)
)
(avgpool): AdaptiveAvgPool2d(output_size=1)
(fc): Linear(in_features=512, out_features=3, bias=True)
)
for param in model.parameters():
print(f' {param.size()} parameters are {param.numel()}')
torch.Size([64, 3, 7, 7]) parameters are 9408 torch.Size([64]) parameters are 64 torch.Size([64]) parameters are 64 torch.Size([64]) parameters are 64 torch.Size([64, 64, 3, 3]) parameters are 36864 torch.Size([64]) parameters are 64 torch.Size([64]) parameters are 64 torch.Size([64]) parameters are 64 torch.Size([64, 64, 3, 3]) parameters are 36864 torch.Size([64]) parameters are 64 torch.Size([64]) parameters are 64 torch.Size([64]) parameters are 64 torch.Size([64, 64, 1, 1]) parameters are 4096 torch.Size([64]) parameters are 64 torch.Size([64]) parameters are 64 torch.Size([64]) parameters are 64 torch.Size([64, 64, 3, 3]) parameters are 36864 torch.Size([64]) parameters are 64 torch.Size([64]) parameters are 64 torch.Size([64]) parameters are 64 torch.Size([64, 64, 3, 3]) parameters are 36864 torch.Size([64]) parameters are 64 torch.Size([64]) parameters are 64 torch.Size([64]) parameters are 64 torch.Size([128, 64, 3, 3]) parameters are 73728 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([128, 128, 3, 3]) parameters are 147456 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([128, 64, 1, 1]) parameters are 8192 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([128, 128, 3, 3]) parameters are 147456 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([128, 128, 3, 3]) parameters are 147456 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([256, 128, 3, 3]) parameters are 294912 torch.Size([256]) parameters are 256 torch.Size([256]) parameters are 256 torch.Size([256]) parameters are 256 torch.Size([256, 256, 3, 3]) parameters are 589824 torch.Size([256]) parameters are 256 torch.Size([256]) parameters are 256 torch.Size([256]) parameters are 256 torch.Size([256, 128, 1, 1]) parameters are 32768 torch.Size([256]) parameters are 256 torch.Size([256]) parameters are 256 torch.Size([256]) parameters are 256 torch.Size([256, 256, 3, 3]) parameters are 589824 torch.Size([256]) parameters are 256 torch.Size([256]) parameters are 256 torch.Size([256]) parameters are 256 torch.Size([256, 256, 3, 3]) parameters are 589824 torch.Size([256]) parameters are 256 torch.Size([256]) parameters are 256 torch.Size([256]) parameters are 256 torch.Size([512, 256, 3, 3]) parameters are 1179648 torch.Size([512]) parameters are 512 torch.Size([512]) parameters are 512 torch.Size([512]) parameters are 512 torch.Size([512, 512, 3, 3]) parameters are 2359296 torch.Size([512]) parameters are 512 torch.Size([512]) parameters are 512 torch.Size([512]) parameters are 512 torch.Size([512, 256, 1, 1]) parameters are 131072 torch.Size([512]) parameters are 512 torch.Size([512]) parameters are 512 torch.Size([512]) parameters are 512 torch.Size([512, 512, 3, 3]) parameters are 2359296 torch.Size([512]) parameters are 512 torch.Size([512]) parameters are 512 torch.Size([512]) parameters are 512 torch.Size([512, 512, 3, 3]) parameters are 2359296 torch.Size([512]) parameters are 512 torch.Size([512]) parameters are 512 torch.Size([512]) parameters are 512 torch.Size([3, 512]) parameters are 1536 torch.Size([3]) parameters are 3
def count_parameters(model):
return sum(p.numel() for p in model.parameters() if p.requires_grad)
print(f'The model has {count_parameters(model):,} trainable parameters and total memory usage is {count_parameters(model)*(4/(2**20)*3)} mb')
The model has 11,187,139 trainable parameters and total memory usage is 128.0266456604004 mb
loss_fn = torch.nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(), lr=3e-5)
N_EPOCHS = 1
best_valid_loss = float('inf')
for epoch in range(N_EPOCHS):
start_time = time.time()
train_loss = train(model, train_loader)
valid_loss = evaluate(model, valid_loader)
end_time = time.time()
epoch_mins, epoch_secs = epoch_time(start_time, end_time)
if valid_loss < best_valid_loss:
print("saving the model")
best_valid_loss = valid_loss
torch.save(model.state_dict(), 'model_1_resnet.pt')
print(f'Epoch: {epoch+1:02} | Time: {epoch_mins}m {epoch_secs}s')
print(f'\tTrain Loss: {train_loss:.3f} | Train PPL: {math.exp(train_loss):7.3f}')
print(f'\t Val. Loss: {valid_loss:.3f} | Val. PPL: {math.exp(valid_loss):7.3f}')
batch: 0 train_loss 1.0592479705810547 perplexity = 2.8842012882232666 batch: 20 train_loss 0.6090688109397888 perplexity = 1.8387184143066406 batch: 40 train_loss 0.25497061014175415 perplexity = 1.2904237508773804 validation/test set evaluation batch: 0 validation_loss 0.2943599224090576 perplexity = 1.3422669172286987 batch: 3 validation_loss 0.2874559462070465 perplexity = 1.3330318927764893 Accuracy: 0.8667 saving the model Epoch: 01 | Time: 1m 29s Train Loss: 0.670 | Train PPL: 1.955 Val. Loss: 0.306 | Val. PPL: 1.358
model.load_state_dict(torch.load('model_1_resnet.pt'))
<All keys matched successfully>
show_preds(model, test_loader) # using learning rate 3e-5
test set evaluation Accuracy: 0.7424
class DenseNet(nn.Module):
def __init__(self, img_channels, num_classes, num_init_features, growth_factor,layers):
super(DenseNet,self).__init__()
self.growth_factor = growth_factor
self.conv1 = nn.Conv2d(in_channels=img_channels,out_channels=num_init_features,kernel_size=7,padding=3,stride=2)
self.bn = nn.BatchNorm2d(num_init_features)
self.relu = nn.ReLU()
self.maxpool = nn.MaxPool2d(kernel_size=3,stride=2,padding=1)
self.denselayer1 = self.make_layer(DenseBlock,num_init_features, layers[0])
self.transitionlayer1 = TransitionBlock(num_init_features + self.growth_factor*layers[0])
self.denselayer2 = self.make_layer(DenseBlock,int((num_init_features + growth_factor*layers[0])/2), layers[1])
self.transitionlayer2 = TransitionBlock(int((num_init_features + self.growth_factor*layers[0])/2 + self.growth_factor*layers[1]))
self.denselayer3 = self.make_layer(DenseBlock,int(((num_init_features + self.growth_factor*layers[0])/2 + self.growth_factor*layers[1])/2), layers[2])
self.transitionlayer3 = TransitionBlock(int(((num_init_features + self.growth_factor*layers[0])/2 + self.growth_factor*layers[1])/2) + self.growth_factor*layers[2])
self.denselayer4 = self.make_layer(DenseBlock,int((((num_init_features + self.growth_factor*layers[0])/2 + self.growth_factor*layers[1])/2 + self.growth_factor*layers[2])/2),
layers[3])
self.averagepool = nn.AdaptiveAvgPool2d(1)
self.fc = nn.Linear(int(num_init_features/8 + self.growth_factor*(layers[0]/8 + layers[1]/4 + layers[2]/2 + layers[3])),num_classes) #we only need to chage the output features while pre training
def forward(self, x):
x = self.relu(self.bn(self.conv1(x)))
x = self.maxpool(x)
x = self.denselayer1(x)
x = self.transitionlayer1(x)
x = self.denselayer2(x)
x = self.transitionlayer2(x)
x = self.denselayer3(x)
x = self.transitionlayer3(x)
x = self.denselayer4(x)
x = self.averagepool(x)
x = x.reshape(x.shape[0], -1)
x = self.fc(x)
return x
def make_layer(self, DenseBlock, features, layer):
dense_block = []
for i in range(layer):
dense_block.append(DenseBlock(features + i*32,self.growth_factor))
return nn.Sequential(*dense_block)
class DenseBlock(nn.Module):
def __init__ (self,input_features, growth_factor):
super(DenseBlock, self).__init__()
self.bn1 = nn.BatchNorm2d(input_features)
self.relu1 = nn.ReLU()
self.conv1 = nn.Conv2d(in_channels=input_features,out_channels=4*growth_factor,kernel_size=1,stride=1)
self.bn2 = nn.BatchNorm2d(4*growth_factor)
self.relu2 = nn.ReLU()
self.conv2 = nn.Conv2d(in_channels=4*growth_factor,out_channels=growth_factor,kernel_size=3,stride=1,padding=1)
def forward(self, x):
concat_layer = x.clone()
x = self.bn1(x)
x = self.relu1(x)
x = self.conv1(x)
x = self.bn2(x)
x = self.relu2(x)
x = self.conv2(x)
return torch.cat((concat_layer, x), dim=1)
class TransitionBlock(nn.Module):
def __init__(self, input_features):
super(TransitionBlock,self).__init__()
self.bn = nn.BatchNorm2d(input_features)
self.relu = nn.ReLU()
self.conv1 = nn.Conv2d(in_channels=input_features,out_channels=int(input_features/2),kernel_size=1,stride=1,padding=0)
self.avpool = nn.AvgPool2d(kernel_size=2, stride=2)
def forward(self, x):
x = self.bn(x)
x = self.relu(x)
x = self.conv1(x)
x = self.avpool(x)
return x
def DenseNet121(img_channels=3, num_classes=1000,num_init_features=64,growth_factor=32):
return DenseNet(img_channels,num_classes, num_init_features, growth_factor,[6, 12, 24, 16])
def DenseNet161(img_channels=3, num_classes=1000,num_init_features=96,growth_factor=48):
return DenseNet(img_channels,num_classes, num_init_features, growth_factor,[6, 12, 36, 24])
def DenseNet169(img_channels=3, num_classes=1000,num_init_features=64,growth_factor=32):
return DenseNet(img_channels,num_classes, num_init_features, growth_factor,[6, 12, 32, 32])
def DenseNet201(img_channels=3, num_classes=1000,num_init_features=64,growth_factor=32):
return DenseNet(img_channels,num_classes, num_init_features, growth_factor,[6, 12, 48, 32])
def DenseNet264(img_channels=3, num_classes=1000,num_init_features=64,growth_factor=32):
return DenseNet(img_channels,num_classes, num_init_features, growth_factor,[6, 12, 64, 48])
model = change_device(DenseNet121(3,3))
model
DenseNet(
(conv1): Conv2d(3, 64, kernel_size=(7, 7), stride=(2, 2), padding=(3, 3))
(bn): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu): ReLU()
(maxpool): MaxPool2d(kernel_size=3, stride=2, padding=1, dilation=1, ceil_mode=False)
(denselayer1): Sequential(
(0): DenseBlock(
(bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu1): ReLU()
(conv1): Conv2d(64, 128, kernel_size=(1, 1), stride=(1, 1))
(bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu2): ReLU()
(conv2): Conv2d(128, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
)
(1): DenseBlock(
(bn1): BatchNorm2d(96, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu1): ReLU()
(conv1): Conv2d(96, 128, kernel_size=(1, 1), stride=(1, 1))
(bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu2): ReLU()
(conv2): Conv2d(128, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
)
(2): DenseBlock(
(bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu1): ReLU()
(conv1): Conv2d(128, 128, kernel_size=(1, 1), stride=(1, 1))
(bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu2): ReLU()
(conv2): Conv2d(128, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
)
(3): DenseBlock(
(bn1): BatchNorm2d(160, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu1): ReLU()
(conv1): Conv2d(160, 128, kernel_size=(1, 1), stride=(1, 1))
(bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu2): ReLU()
(conv2): Conv2d(128, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
)
(4): DenseBlock(
(bn1): BatchNorm2d(192, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu1): ReLU()
(conv1): Conv2d(192, 128, kernel_size=(1, 1), stride=(1, 1))
(bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu2): ReLU()
(conv2): Conv2d(128, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
)
(5): DenseBlock(
(bn1): BatchNorm2d(224, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu1): ReLU()
(conv1): Conv2d(224, 128, kernel_size=(1, 1), stride=(1, 1))
(bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu2): ReLU()
(conv2): Conv2d(128, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
)
)
(transitionlayer1): TransitionBlock(
(bn): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu): ReLU()
(conv1): Conv2d(256, 128, kernel_size=(1, 1), stride=(1, 1))
(avpool): AvgPool2d(kernel_size=2, stride=2, padding=0)
)
(denselayer2): Sequential(
(0): DenseBlock(
(bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu1): ReLU()
(conv1): Conv2d(128, 128, kernel_size=(1, 1), stride=(1, 1))
(bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu2): ReLU()
(conv2): Conv2d(128, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
)
(1): DenseBlock(
(bn1): BatchNorm2d(160, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu1): ReLU()
(conv1): Conv2d(160, 128, kernel_size=(1, 1), stride=(1, 1))
(bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu2): ReLU()
(conv2): Conv2d(128, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
)
(2): DenseBlock(
(bn1): BatchNorm2d(192, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu1): ReLU()
(conv1): Conv2d(192, 128, kernel_size=(1, 1), stride=(1, 1))
(bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu2): ReLU()
(conv2): Conv2d(128, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
)
(3): DenseBlock(
(bn1): BatchNorm2d(224, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu1): ReLU()
(conv1): Conv2d(224, 128, kernel_size=(1, 1), stride=(1, 1))
(bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu2): ReLU()
(conv2): Conv2d(128, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
)
(4): DenseBlock(
(bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu1): ReLU()
(conv1): Conv2d(256, 128, kernel_size=(1, 1), stride=(1, 1))
(bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu2): ReLU()
(conv2): Conv2d(128, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
)
(5): DenseBlock(
(bn1): BatchNorm2d(288, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu1): ReLU()
(conv1): Conv2d(288, 128, kernel_size=(1, 1), stride=(1, 1))
(bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu2): ReLU()
(conv2): Conv2d(128, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
)
(6): DenseBlock(
(bn1): BatchNorm2d(320, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu1): ReLU()
(conv1): Conv2d(320, 128, kernel_size=(1, 1), stride=(1, 1))
(bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu2): ReLU()
(conv2): Conv2d(128, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
)
(7): DenseBlock(
(bn1): BatchNorm2d(352, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu1): ReLU()
(conv1): Conv2d(352, 128, kernel_size=(1, 1), stride=(1, 1))
(bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu2): ReLU()
(conv2): Conv2d(128, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
)
(8): DenseBlock(
(bn1): BatchNorm2d(384, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu1): ReLU()
(conv1): Conv2d(384, 128, kernel_size=(1, 1), stride=(1, 1))
(bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu2): ReLU()
(conv2): Conv2d(128, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
)
(9): DenseBlock(
(bn1): BatchNorm2d(416, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu1): ReLU()
(conv1): Conv2d(416, 128, kernel_size=(1, 1), stride=(1, 1))
(bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu2): ReLU()
(conv2): Conv2d(128, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
)
(10): DenseBlock(
(bn1): BatchNorm2d(448, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu1): ReLU()
(conv1): Conv2d(448, 128, kernel_size=(1, 1), stride=(1, 1))
(bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu2): ReLU()
(conv2): Conv2d(128, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
)
(11): DenseBlock(
(bn1): BatchNorm2d(480, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu1): ReLU()
(conv1): Conv2d(480, 128, kernel_size=(1, 1), stride=(1, 1))
(bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu2): ReLU()
(conv2): Conv2d(128, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
)
)
(transitionlayer2): TransitionBlock(
(bn): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu): ReLU()
(conv1): Conv2d(512, 256, kernel_size=(1, 1), stride=(1, 1))
(avpool): AvgPool2d(kernel_size=2, stride=2, padding=0)
)
(denselayer3): Sequential(
(0): DenseBlock(
(bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu1): ReLU()
(conv1): Conv2d(256, 128, kernel_size=(1, 1), stride=(1, 1))
(bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu2): ReLU()
(conv2): Conv2d(128, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
)
(1): DenseBlock(
(bn1): BatchNorm2d(288, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu1): ReLU()
(conv1): Conv2d(288, 128, kernel_size=(1, 1), stride=(1, 1))
(bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu2): ReLU()
(conv2): Conv2d(128, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
)
(2): DenseBlock(
(bn1): BatchNorm2d(320, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu1): ReLU()
(conv1): Conv2d(320, 128, kernel_size=(1, 1), stride=(1, 1))
(bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu2): ReLU()
(conv2): Conv2d(128, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
)
(3): DenseBlock(
(bn1): BatchNorm2d(352, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu1): ReLU()
(conv1): Conv2d(352, 128, kernel_size=(1, 1), stride=(1, 1))
(bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu2): ReLU()
(conv2): Conv2d(128, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
)
(4): DenseBlock(
(bn1): BatchNorm2d(384, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu1): ReLU()
(conv1): Conv2d(384, 128, kernel_size=(1, 1), stride=(1, 1))
(bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu2): ReLU()
(conv2): Conv2d(128, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
)
(5): DenseBlock(
(bn1): BatchNorm2d(416, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu1): ReLU()
(conv1): Conv2d(416, 128, kernel_size=(1, 1), stride=(1, 1))
(bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu2): ReLU()
(conv2): Conv2d(128, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
)
(6): DenseBlock(
(bn1): BatchNorm2d(448, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu1): ReLU()
(conv1): Conv2d(448, 128, kernel_size=(1, 1), stride=(1, 1))
(bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu2): ReLU()
(conv2): Conv2d(128, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
)
(7): DenseBlock(
(bn1): BatchNorm2d(480, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu1): ReLU()
(conv1): Conv2d(480, 128, kernel_size=(1, 1), stride=(1, 1))
(bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu2): ReLU()
(conv2): Conv2d(128, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
)
(8): DenseBlock(
(bn1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu1): ReLU()
(conv1): Conv2d(512, 128, kernel_size=(1, 1), stride=(1, 1))
(bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu2): ReLU()
(conv2): Conv2d(128, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
)
(9): DenseBlock(
(bn1): BatchNorm2d(544, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu1): ReLU()
(conv1): Conv2d(544, 128, kernel_size=(1, 1), stride=(1, 1))
(bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu2): ReLU()
(conv2): Conv2d(128, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
)
(10): DenseBlock(
(bn1): BatchNorm2d(576, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu1): ReLU()
(conv1): Conv2d(576, 128, kernel_size=(1, 1), stride=(1, 1))
(bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu2): ReLU()
(conv2): Conv2d(128, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
)
(11): DenseBlock(
(bn1): BatchNorm2d(608, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu1): ReLU()
(conv1): Conv2d(608, 128, kernel_size=(1, 1), stride=(1, 1))
(bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu2): ReLU()
(conv2): Conv2d(128, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
)
(12): DenseBlock(
(bn1): BatchNorm2d(640, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu1): ReLU()
(conv1): Conv2d(640, 128, kernel_size=(1, 1), stride=(1, 1))
(bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu2): ReLU()
(conv2): Conv2d(128, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
)
(13): DenseBlock(
(bn1): BatchNorm2d(672, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu1): ReLU()
(conv1): Conv2d(672, 128, kernel_size=(1, 1), stride=(1, 1))
(bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu2): ReLU()
(conv2): Conv2d(128, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
)
(14): DenseBlock(
(bn1): BatchNorm2d(704, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu1): ReLU()
(conv1): Conv2d(704, 128, kernel_size=(1, 1), stride=(1, 1))
(bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu2): ReLU()
(conv2): Conv2d(128, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
)
(15): DenseBlock(
(bn1): BatchNorm2d(736, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu1): ReLU()
(conv1): Conv2d(736, 128, kernel_size=(1, 1), stride=(1, 1))
(bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu2): ReLU()
(conv2): Conv2d(128, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
)
(16): DenseBlock(
(bn1): BatchNorm2d(768, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu1): ReLU()
(conv1): Conv2d(768, 128, kernel_size=(1, 1), stride=(1, 1))
(bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu2): ReLU()
(conv2): Conv2d(128, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
)
(17): DenseBlock(
(bn1): BatchNorm2d(800, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu1): ReLU()
(conv1): Conv2d(800, 128, kernel_size=(1, 1), stride=(1, 1))
(bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu2): ReLU()
(conv2): Conv2d(128, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
)
(18): DenseBlock(
(bn1): BatchNorm2d(832, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu1): ReLU()
(conv1): Conv2d(832, 128, kernel_size=(1, 1), stride=(1, 1))
(bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu2): ReLU()
(conv2): Conv2d(128, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
)
(19): DenseBlock(
(bn1): BatchNorm2d(864, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu1): ReLU()
(conv1): Conv2d(864, 128, kernel_size=(1, 1), stride=(1, 1))
(bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu2): ReLU()
(conv2): Conv2d(128, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
)
(20): DenseBlock(
(bn1): BatchNorm2d(896, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu1): ReLU()
(conv1): Conv2d(896, 128, kernel_size=(1, 1), stride=(1, 1))
(bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu2): ReLU()
(conv2): Conv2d(128, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
)
(21): DenseBlock(
(bn1): BatchNorm2d(928, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu1): ReLU()
(conv1): Conv2d(928, 128, kernel_size=(1, 1), stride=(1, 1))
(bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu2): ReLU()
(conv2): Conv2d(128, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
)
(22): DenseBlock(
(bn1): BatchNorm2d(960, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu1): ReLU()
(conv1): Conv2d(960, 128, kernel_size=(1, 1), stride=(1, 1))
(bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu2): ReLU()
(conv2): Conv2d(128, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
)
(23): DenseBlock(
(bn1): BatchNorm2d(992, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu1): ReLU()
(conv1): Conv2d(992, 128, kernel_size=(1, 1), stride=(1, 1))
(bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu2): ReLU()
(conv2): Conv2d(128, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
)
)
(transitionlayer3): TransitionBlock(
(bn): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu): ReLU()
(conv1): Conv2d(1024, 512, kernel_size=(1, 1), stride=(1, 1))
(avpool): AvgPool2d(kernel_size=2, stride=2, padding=0)
)
(denselayer4): Sequential(
(0): DenseBlock(
(bn1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu1): ReLU()
(conv1): Conv2d(512, 128, kernel_size=(1, 1), stride=(1, 1))
(bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu2): ReLU()
(conv2): Conv2d(128, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
)
(1): DenseBlock(
(bn1): BatchNorm2d(544, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu1): ReLU()
(conv1): Conv2d(544, 128, kernel_size=(1, 1), stride=(1, 1))
(bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu2): ReLU()
(conv2): Conv2d(128, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
)
(2): DenseBlock(
(bn1): BatchNorm2d(576, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu1): ReLU()
(conv1): Conv2d(576, 128, kernel_size=(1, 1), stride=(1, 1))
(bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu2): ReLU()
(conv2): Conv2d(128, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
)
(3): DenseBlock(
(bn1): BatchNorm2d(608, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu1): ReLU()
(conv1): Conv2d(608, 128, kernel_size=(1, 1), stride=(1, 1))
(bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu2): ReLU()
(conv2): Conv2d(128, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
)
(4): DenseBlock(
(bn1): BatchNorm2d(640, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu1): ReLU()
(conv1): Conv2d(640, 128, kernel_size=(1, 1), stride=(1, 1))
(bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu2): ReLU()
(conv2): Conv2d(128, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
)
(5): DenseBlock(
(bn1): BatchNorm2d(672, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu1): ReLU()
(conv1): Conv2d(672, 128, kernel_size=(1, 1), stride=(1, 1))
(bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu2): ReLU()
(conv2): Conv2d(128, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
)
(6): DenseBlock(
(bn1): BatchNorm2d(704, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu1): ReLU()
(conv1): Conv2d(704, 128, kernel_size=(1, 1), stride=(1, 1))
(bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu2): ReLU()
(conv2): Conv2d(128, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
)
(7): DenseBlock(
(bn1): BatchNorm2d(736, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu1): ReLU()
(conv1): Conv2d(736, 128, kernel_size=(1, 1), stride=(1, 1))
(bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu2): ReLU()
(conv2): Conv2d(128, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
)
(8): DenseBlock(
(bn1): BatchNorm2d(768, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu1): ReLU()
(conv1): Conv2d(768, 128, kernel_size=(1, 1), stride=(1, 1))
(bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu2): ReLU()
(conv2): Conv2d(128, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
)
(9): DenseBlock(
(bn1): BatchNorm2d(800, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu1): ReLU()
(conv1): Conv2d(800, 128, kernel_size=(1, 1), stride=(1, 1))
(bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu2): ReLU()
(conv2): Conv2d(128, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
)
(10): DenseBlock(
(bn1): BatchNorm2d(832, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu1): ReLU()
(conv1): Conv2d(832, 128, kernel_size=(1, 1), stride=(1, 1))
(bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu2): ReLU()
(conv2): Conv2d(128, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
)
(11): DenseBlock(
(bn1): BatchNorm2d(864, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu1): ReLU()
(conv1): Conv2d(864, 128, kernel_size=(1, 1), stride=(1, 1))
(bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu2): ReLU()
(conv2): Conv2d(128, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
)
(12): DenseBlock(
(bn1): BatchNorm2d(896, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu1): ReLU()
(conv1): Conv2d(896, 128, kernel_size=(1, 1), stride=(1, 1))
(bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu2): ReLU()
(conv2): Conv2d(128, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
)
(13): DenseBlock(
(bn1): BatchNorm2d(928, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu1): ReLU()
(conv1): Conv2d(928, 128, kernel_size=(1, 1), stride=(1, 1))
(bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu2): ReLU()
(conv2): Conv2d(128, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
)
(14): DenseBlock(
(bn1): BatchNorm2d(960, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu1): ReLU()
(conv1): Conv2d(960, 128, kernel_size=(1, 1), stride=(1, 1))
(bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu2): ReLU()
(conv2): Conv2d(128, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
)
(15): DenseBlock(
(bn1): BatchNorm2d(992, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu1): ReLU()
(conv1): Conv2d(992, 128, kernel_size=(1, 1), stride=(1, 1))
(bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(relu2): ReLU()
(conv2): Conv2d(128, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
)
)
(averagepool): AdaptiveAvgPool2d(output_size=1)
(fc): Linear(in_features=1024, out_features=3, bias=True)
)
for param in model.parameters():
print(f' {param.size()} parameters are {param.numel()}')
torch.Size([64, 3, 7, 7]) parameters are 9408 torch.Size([64]) parameters are 64 torch.Size([64]) parameters are 64 torch.Size([64]) parameters are 64 torch.Size([64]) parameters are 64 torch.Size([64]) parameters are 64 torch.Size([128, 64, 1, 1]) parameters are 8192 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([32, 128, 3, 3]) parameters are 36864 torch.Size([32]) parameters are 32 torch.Size([96]) parameters are 96 torch.Size([96]) parameters are 96 torch.Size([128, 96, 1, 1]) parameters are 12288 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([32, 128, 3, 3]) parameters are 36864 torch.Size([32]) parameters are 32 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([128, 128, 1, 1]) parameters are 16384 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([32, 128, 3, 3]) parameters are 36864 torch.Size([32]) parameters are 32 torch.Size([160]) parameters are 160 torch.Size([160]) parameters are 160 torch.Size([128, 160, 1, 1]) parameters are 20480 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([32, 128, 3, 3]) parameters are 36864 torch.Size([32]) parameters are 32 torch.Size([192]) parameters are 192 torch.Size([192]) parameters are 192 torch.Size([128, 192, 1, 1]) parameters are 24576 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([32, 128, 3, 3]) parameters are 36864 torch.Size([32]) parameters are 32 torch.Size([224]) parameters are 224 torch.Size([224]) parameters are 224 torch.Size([128, 224, 1, 1]) parameters are 28672 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([32, 128, 3, 3]) parameters are 36864 torch.Size([32]) parameters are 32 torch.Size([256]) parameters are 256 torch.Size([256]) parameters are 256 torch.Size([128, 256, 1, 1]) parameters are 32768 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([128, 128, 1, 1]) parameters are 16384 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([32, 128, 3, 3]) parameters are 36864 torch.Size([32]) parameters are 32 torch.Size([160]) parameters are 160 torch.Size([160]) parameters are 160 torch.Size([128, 160, 1, 1]) parameters are 20480 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([32, 128, 3, 3]) parameters are 36864 torch.Size([32]) parameters are 32 torch.Size([192]) parameters are 192 torch.Size([192]) parameters are 192 torch.Size([128, 192, 1, 1]) parameters are 24576 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([32, 128, 3, 3]) parameters are 36864 torch.Size([32]) parameters are 32 torch.Size([224]) parameters are 224 torch.Size([224]) parameters are 224 torch.Size([128, 224, 1, 1]) parameters are 28672 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([32, 128, 3, 3]) parameters are 36864 torch.Size([32]) parameters are 32 torch.Size([256]) parameters are 256 torch.Size([256]) parameters are 256 torch.Size([128, 256, 1, 1]) parameters are 32768 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([32, 128, 3, 3]) parameters are 36864 torch.Size([32]) parameters are 32 torch.Size([288]) parameters are 288 torch.Size([288]) parameters are 288 torch.Size([128, 288, 1, 1]) parameters are 36864 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([32, 128, 3, 3]) parameters are 36864 torch.Size([32]) parameters are 32 torch.Size([320]) parameters are 320 torch.Size([320]) parameters are 320 torch.Size([128, 320, 1, 1]) parameters are 40960 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([32, 128, 3, 3]) parameters are 36864 torch.Size([32]) parameters are 32 torch.Size([352]) parameters are 352 torch.Size([352]) parameters are 352 torch.Size([128, 352, 1, 1]) parameters are 45056 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([32, 128, 3, 3]) parameters are 36864 torch.Size([32]) parameters are 32 torch.Size([384]) parameters are 384 torch.Size([384]) parameters are 384 torch.Size([128, 384, 1, 1]) parameters are 49152 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([32, 128, 3, 3]) parameters are 36864 torch.Size([32]) parameters are 32 torch.Size([416]) parameters are 416 torch.Size([416]) parameters are 416 torch.Size([128, 416, 1, 1]) parameters are 53248 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([32, 128, 3, 3]) parameters are 36864 torch.Size([32]) parameters are 32 torch.Size([448]) parameters are 448 torch.Size([448]) parameters are 448 torch.Size([128, 448, 1, 1]) parameters are 57344 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([32, 128, 3, 3]) parameters are 36864 torch.Size([32]) parameters are 32 torch.Size([480]) parameters are 480 torch.Size([480]) parameters are 480 torch.Size([128, 480, 1, 1]) parameters are 61440 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([32, 128, 3, 3]) parameters are 36864 torch.Size([32]) parameters are 32 torch.Size([512]) parameters are 512 torch.Size([512]) parameters are 512 torch.Size([256, 512, 1, 1]) parameters are 131072 torch.Size([256]) parameters are 256 torch.Size([256]) parameters are 256 torch.Size([256]) parameters are 256 torch.Size([128, 256, 1, 1]) parameters are 32768 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([32, 128, 3, 3]) parameters are 36864 torch.Size([32]) parameters are 32 torch.Size([288]) parameters are 288 torch.Size([288]) parameters are 288 torch.Size([128, 288, 1, 1]) parameters are 36864 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([32, 128, 3, 3]) parameters are 36864 torch.Size([32]) parameters are 32 torch.Size([320]) parameters are 320 torch.Size([320]) parameters are 320 torch.Size([128, 320, 1, 1]) parameters are 40960 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([32, 128, 3, 3]) parameters are 36864 torch.Size([32]) parameters are 32 torch.Size([352]) parameters are 352 torch.Size([352]) parameters are 352 torch.Size([128, 352, 1, 1]) parameters are 45056 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([32, 128, 3, 3]) parameters are 36864 torch.Size([32]) parameters are 32 torch.Size([384]) parameters are 384 torch.Size([384]) parameters are 384 torch.Size([128, 384, 1, 1]) parameters are 49152 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([32, 128, 3, 3]) parameters are 36864 torch.Size([32]) parameters are 32 torch.Size([416]) parameters are 416 torch.Size([416]) parameters are 416 torch.Size([128, 416, 1, 1]) parameters are 53248 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([32, 128, 3, 3]) parameters are 36864 torch.Size([32]) parameters are 32 torch.Size([448]) parameters are 448 torch.Size([448]) parameters are 448 torch.Size([128, 448, 1, 1]) parameters are 57344 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([32, 128, 3, 3]) parameters are 36864 torch.Size([32]) parameters are 32 torch.Size([480]) parameters are 480 torch.Size([480]) parameters are 480 torch.Size([128, 480, 1, 1]) parameters are 61440 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([32, 128, 3, 3]) parameters are 36864 torch.Size([32]) parameters are 32 torch.Size([512]) parameters are 512 torch.Size([512]) parameters are 512 torch.Size([128, 512, 1, 1]) parameters are 65536 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([32, 128, 3, 3]) parameters are 36864 torch.Size([32]) parameters are 32 torch.Size([544]) parameters are 544 torch.Size([544]) parameters are 544 torch.Size([128, 544, 1, 1]) parameters are 69632 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([32, 128, 3, 3]) parameters are 36864 torch.Size([32]) parameters are 32 torch.Size([576]) parameters are 576 torch.Size([576]) parameters are 576 torch.Size([128, 576, 1, 1]) parameters are 73728 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([32, 128, 3, 3]) parameters are 36864 torch.Size([32]) parameters are 32 torch.Size([608]) parameters are 608 torch.Size([608]) parameters are 608 torch.Size([128, 608, 1, 1]) parameters are 77824 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([32, 128, 3, 3]) parameters are 36864 torch.Size([32]) parameters are 32 torch.Size([640]) parameters are 640 torch.Size([640]) parameters are 640 torch.Size([128, 640, 1, 1]) parameters are 81920 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([32, 128, 3, 3]) parameters are 36864 torch.Size([32]) parameters are 32 torch.Size([672]) parameters are 672 torch.Size([672]) parameters are 672 torch.Size([128, 672, 1, 1]) parameters are 86016 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([32, 128, 3, 3]) parameters are 36864 torch.Size([32]) parameters are 32 torch.Size([704]) parameters are 704 torch.Size([704]) parameters are 704 torch.Size([128, 704, 1, 1]) parameters are 90112 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([32, 128, 3, 3]) parameters are 36864 torch.Size([32]) parameters are 32 torch.Size([736]) parameters are 736 torch.Size([736]) parameters are 736 torch.Size([128, 736, 1, 1]) parameters are 94208 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([32, 128, 3, 3]) parameters are 36864 torch.Size([32]) parameters are 32 torch.Size([768]) parameters are 768 torch.Size([768]) parameters are 768 torch.Size([128, 768, 1, 1]) parameters are 98304 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([32, 128, 3, 3]) parameters are 36864 torch.Size([32]) parameters are 32 torch.Size([800]) parameters are 800 torch.Size([800]) parameters are 800 torch.Size([128, 800, 1, 1]) parameters are 102400 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([32, 128, 3, 3]) parameters are 36864 torch.Size([32]) parameters are 32 torch.Size([832]) parameters are 832 torch.Size([832]) parameters are 832 torch.Size([128, 832, 1, 1]) parameters are 106496 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([32, 128, 3, 3]) parameters are 36864 torch.Size([32]) parameters are 32 torch.Size([864]) parameters are 864 torch.Size([864]) parameters are 864 torch.Size([128, 864, 1, 1]) parameters are 110592 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([32, 128, 3, 3]) parameters are 36864 torch.Size([32]) parameters are 32 torch.Size([896]) parameters are 896 torch.Size([896]) parameters are 896 torch.Size([128, 896, 1, 1]) parameters are 114688 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([32, 128, 3, 3]) parameters are 36864 torch.Size([32]) parameters are 32 torch.Size([928]) parameters are 928 torch.Size([928]) parameters are 928 torch.Size([128, 928, 1, 1]) parameters are 118784 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([32, 128, 3, 3]) parameters are 36864 torch.Size([32]) parameters are 32 torch.Size([960]) parameters are 960 torch.Size([960]) parameters are 960 torch.Size([128, 960, 1, 1]) parameters are 122880 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([32, 128, 3, 3]) parameters are 36864 torch.Size([32]) parameters are 32 torch.Size([992]) parameters are 992 torch.Size([992]) parameters are 992 torch.Size([128, 992, 1, 1]) parameters are 126976 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([32, 128, 3, 3]) parameters are 36864 torch.Size([32]) parameters are 32 torch.Size([1024]) parameters are 1024 torch.Size([1024]) parameters are 1024 torch.Size([512, 1024, 1, 1]) parameters are 524288 torch.Size([512]) parameters are 512 torch.Size([512]) parameters are 512 torch.Size([512]) parameters are 512 torch.Size([128, 512, 1, 1]) parameters are 65536 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([32, 128, 3, 3]) parameters are 36864 torch.Size([32]) parameters are 32 torch.Size([544]) parameters are 544 torch.Size([544]) parameters are 544 torch.Size([128, 544, 1, 1]) parameters are 69632 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([32, 128, 3, 3]) parameters are 36864 torch.Size([32]) parameters are 32 torch.Size([576]) parameters are 576 torch.Size([576]) parameters are 576 torch.Size([128, 576, 1, 1]) parameters are 73728 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([32, 128, 3, 3]) parameters are 36864 torch.Size([32]) parameters are 32 torch.Size([608]) parameters are 608 torch.Size([608]) parameters are 608 torch.Size([128, 608, 1, 1]) parameters are 77824 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([32, 128, 3, 3]) parameters are 36864 torch.Size([32]) parameters are 32 torch.Size([640]) parameters are 640 torch.Size([640]) parameters are 640 torch.Size([128, 640, 1, 1]) parameters are 81920 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([32, 128, 3, 3]) parameters are 36864 torch.Size([32]) parameters are 32 torch.Size([672]) parameters are 672 torch.Size([672]) parameters are 672 torch.Size([128, 672, 1, 1]) parameters are 86016 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([32, 128, 3, 3]) parameters are 36864 torch.Size([32]) parameters are 32 torch.Size([704]) parameters are 704 torch.Size([704]) parameters are 704 torch.Size([128, 704, 1, 1]) parameters are 90112 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([32, 128, 3, 3]) parameters are 36864 torch.Size([32]) parameters are 32 torch.Size([736]) parameters are 736 torch.Size([736]) parameters are 736 torch.Size([128, 736, 1, 1]) parameters are 94208 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([32, 128, 3, 3]) parameters are 36864 torch.Size([32]) parameters are 32 torch.Size([768]) parameters are 768 torch.Size([768]) parameters are 768 torch.Size([128, 768, 1, 1]) parameters are 98304 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([32, 128, 3, 3]) parameters are 36864 torch.Size([32]) parameters are 32 torch.Size([800]) parameters are 800 torch.Size([800]) parameters are 800 torch.Size([128, 800, 1, 1]) parameters are 102400 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([32, 128, 3, 3]) parameters are 36864 torch.Size([32]) parameters are 32 torch.Size([832]) parameters are 832 torch.Size([832]) parameters are 832 torch.Size([128, 832, 1, 1]) parameters are 106496 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([32, 128, 3, 3]) parameters are 36864 torch.Size([32]) parameters are 32 torch.Size([864]) parameters are 864 torch.Size([864]) parameters are 864 torch.Size([128, 864, 1, 1]) parameters are 110592 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([32, 128, 3, 3]) parameters are 36864 torch.Size([32]) parameters are 32 torch.Size([896]) parameters are 896 torch.Size([896]) parameters are 896 torch.Size([128, 896, 1, 1]) parameters are 114688 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([32, 128, 3, 3]) parameters are 36864 torch.Size([32]) parameters are 32 torch.Size([928]) parameters are 928 torch.Size([928]) parameters are 928 torch.Size([128, 928, 1, 1]) parameters are 118784 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([32, 128, 3, 3]) parameters are 36864 torch.Size([32]) parameters are 32 torch.Size([960]) parameters are 960 torch.Size([960]) parameters are 960 torch.Size([128, 960, 1, 1]) parameters are 122880 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([32, 128, 3, 3]) parameters are 36864 torch.Size([32]) parameters are 32 torch.Size([992]) parameters are 992 torch.Size([992]) parameters are 992 torch.Size([128, 992, 1, 1]) parameters are 126976 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([128]) parameters are 128 torch.Size([32, 128, 3, 3]) parameters are 36864 torch.Size([32]) parameters are 32 torch.Size([3, 1024]) parameters are 3072 torch.Size([3]) parameters are 3
def count_parameters(model):
return sum(p.numel() for p in model.parameters() if p.requires_grad)
print(f'The model has {count_parameters(model):,} trainable parameters and total memory usage is {count_parameters(model)*(4/(2**20)*3)} mb')
The model has 6,965,123 trainable parameters and total memory usage is 79.70950698852539 mb
loss_fn = torch.nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(), lr=3e-5)
N_EPOCHS = 1
best_valid_loss = float('inf')
for epoch in range(N_EPOCHS):
start_time = time.time()
train_loss = train(model, train_loader)
valid_loss = evaluate(model, valid_loader)
end_time = time.time()
epoch_mins, epoch_secs = epoch_time(start_time, end_time)
if valid_loss < best_valid_loss:
print("saving the model")
best_valid_loss = valid_loss
torch.save(model.state_dict(), 'model_1_densenet.pt')
print(f'Epoch: {epoch+1:02} | Time: {epoch_mins}m {epoch_secs}s')
print(f'\tTrain Loss: {train_loss:.3f} | Train PPL: {math.exp(train_loss):7.3f}')
print(f'\t Val. Loss: {valid_loss:.3f} | Val. PPL: {math.exp(valid_loss):7.3f}')
batch: 0 train_loss 1.0867397785186768 perplexity = 2.9645931720733643 batch: 20 train_loss 0.9385002851486206 perplexity = 2.556144952774048 batch: 40 train_loss 0.9804096221923828 perplexity = 2.6655478477478027 validation/test set evaluation batch: 0 validation_loss 0.5349668264389038 perplexity = 1.707391619682312 batch: 3 validation_loss 0.859047532081604 perplexity = 2.3609108924865723 Accuracy: 0.5667 saving the model Epoch: 01 | Time: 3m 38s Train Loss: 0.900 | Train PPL: 2.459 Val. Loss: 0.630 | Val. PPL: 1.878
show_preds(model, test_loader)
test set evaluation Accuracy: 0.5909
Since denset pre trained obtained the higest results we will use that for further analysis
import plotly.figure_factory as ff
data_matrix = [['Classes','Data_available'],
['Normal', 70],
['Viral_Pneumonia', 70],
['Covid', 111]]
colorscale = [[0, '#4d004c'],[.5, '#f2e5ff'],[1, '#ffffff']]
fig = ff.create_table(data_matrix,colorscale=colorscale)
fig.update_layout(
title_text = 'Data used for training',
margin = {'t':40},
height = 200,
title_x=0.5
)
fig.show()
Accuracy Table
import plotly.figure_factory as ff
data_matrix = [['Testing paramter','Self-VGG-16', 'Self-Resnet','Self-Densenet'],
['Accuracy', 0.5152, 0.7424, 0.5909]]
fig = ff.create_table(data_matrix)
fig.show()